/**
 * 
 */
package org.paybiz.core.payplatform.yeePay.util;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import org.paybiz.core.payplatform.yeePay.constant.RechargeCardConstant.RechargeCardType;



/**
 * 充值卡金额验证
 * 
 * @author nassir wen
 * @data 2012-4-6 下午03:24:07
 * @version V2.5
 * @Company: MSD.
 * @Copyright Copyright (c) 2012
 */
@SuppressWarnings("serial")
public class RechargeCardValidator {

    /**
     * 移动充值卡
     */
    private final static List<Integer> szxAmounts = new ArrayList<Integer>() {
        {
            add(1000);
            add(2000);
            add(3000);
            add(5000);
            add(10000);
            add(20000);
            add(30000);
            add(50000);
        }
    };

    /**
     * 移动充值卡(卡号+密码)长度
     */
    private final static List<Integer> szxLengths = new ArrayList<Integer>() {
        {
            add(18);// 浙江：卡号10位 密码8位
            add(33);// 福建：卡号16位 密码17位
            add(35);// 全国卡：卡号17位 密码18位
            add(37);// 辽宁：卡号16位 密码21位
        }
    };

    /**
     * 电信卡
     */
    private final static List<Integer> telecomAmounts = new ArrayList<Integer>() {
        {
            add(5000);
            add(10000);
        }
    };

    private final static List<Integer> telecomLengths = new ArrayList<Integer>() {
        {
            add(37);// 中国电信充值付费卡卡号19位，密码18位的阿拉伯数字
        }
    };

    /**
     * 联通卡
     */
    private final static List<Integer> unicomAmounts = new ArrayList<Integer>() {
        {
            add(2000);
            add(3000);
            add(5000);
            add(10000);
            add(30000);
            add(50000);
        }
    };

    private final static List<Integer> unicomLengths = new ArrayList<Integer>() {
        {
            add(34);// 联通全国卡，卡号15位阿拉伯数字，密码19位阿拉伯数字
        }
    };

    /**
     * 充值卡效验:卡号及密码验证(注：验证通过不一定是一张可用的卡) 。未开能的支付类型无法通过效验
     * 
     * @param cardType
     *            充值卡类型
     * @param amount
     *            充值卡金额 以分为单位
     * @return
     */
    public static boolean validateCard(int cardType, String cardNo,
            String cardPasswd) {
        boolean result = false;
        if (StringUtils.isEmpty(cardNo) || StringUtils.isEmpty(cardPasswd)) {
            return result;
        }
        int len = cardNo.length() + cardPasswd.length();
        if (cardType == RechargeCardType.SZX.key()) {
            if (StringUtils.isNumeric(cardNo)
                    && StringUtils.isNumeric(cardPasswd)) {
                if (szxLengths.contains(len)) {
                    result = true;
                }
            }
        } else if (cardType == RechargeCardType.UNICOM.key()) {
            if (StringUtils.isNumeric(cardNo)
                    && StringUtils.isNumeric(cardPasswd)) {
                if (unicomLengths.contains(len)) {
                    result = true;
                }
            }
        } else if (cardType == RechargeCardType.TELECOM.key()) {
            if (StringUtils.isNumeric(cardNo)
                    && StringUtils.isNumeric(cardPasswd)) {
                if (telecomLengths.contains(len)) {
                    result = true;
                }
            }
        }
        return result;
    }

    /**
     * 验证充值卡金额
     * @param cardType 以分为单位
     * @param amount 以分为单位
     * @return
     */
    public static boolean validateCardAmount(int cardType, int amount) {
        boolean result = false;
        if (cardType == RechargeCardType.SZX.key()) {
            result = szxAmounts.contains(amount);
        } else if (cardType == RechargeCardType.UNICOM.key()) {
            result = unicomAmounts.contains(amount);
        } else if (cardType == RechargeCardType.TELECOM.key()) {
            result = telecomAmounts.contains(amount);
        }
        return result;
    }
    
    public static void main(String[] args) {
        System.out.println("移动充值卡(17-18)：" + validateCard(RechargeCardType.SZX.key(),
                RandomStringUtils.randomNumeric(17), RandomStringUtils.randomNumeric(18)));
        System.out.println("移动充值卡(10-8)：" + validateCard(RechargeCardType.SZX.key(),
                RandomStringUtils.randomNumeric(10), RandomStringUtils.randomNumeric(8)));
        System.out.println("移动充值卡(16-17)：" + validateCard(RechargeCardType.SZX.key(),
                RandomStringUtils.randomNumeric(16), RandomStringUtils.randomNumeric(17)));
        System.out.println("移动充值卡(16-21)：" + validateCard(RechargeCardType.SZX.key(), 
                RandomStringUtils.randomNumeric(16), RandomStringUtils.randomNumeric(21)));
        System.out.println("电信充值卡(19-18)：" + validateCard(RechargeCardType.TELECOM.key(), 
                RandomStringUtils.randomNumeric(19), RandomStringUtils.randomNumeric(18)));
        System.out.println("联通充值卡(15-19)：" + validateCard(RechargeCardType.UNICOM.key(), 
                RandomStringUtils.randomNumeric(15), RandomStringUtils.randomNumeric(19)));
        System.out.println("联通充值卡金额(5000)：" + validateCardAmount(RechargeCardType.UNICOM.key(), 
                5000));
    }
}
